package com.spdzen.support;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 树节点
 * 
 * @author accountwcx@qq.com
 * @param <T> 树节点的绑定数据类
 */
public class SimpleTreeNode<T> implements Serializable {
	private static final long serialVersionUID = 2112231486136077367L;

	/**
	 * 树节点id
	 */
	private String id;
	
	/**
	 * 树节点上级id
	 */
	private String parentId;
	
	/**
	 * 树节点名称
	 */
	private String name;
	
	private boolean open = false;
	private T nodeData;
	private boolean isParent = false;
	private boolean hasParent = false;
	private boolean checked = false;
	
	/**
	 * 子节点，如果没有子节点，则列表长度为0
	 */
	private List<SimpleTreeNode<T>> children = new ArrayList<SimpleTreeNode<T>>();

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getParentId() {
		return parentId;
	}

	public void setParentId(String parentId) {
		this.parentId = parentId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<SimpleTreeNode<T>> getChildren() {
		return children;
	}

	public T getNodeData() {
		return nodeData;
	}

	public void setNodeData(T nodeData) {
		this.nodeData = nodeData;
	}

	public boolean isOpen() {
		return open;
	}

	public void setOpen(boolean open) {
		this.open = open;
	}

	public boolean isIsParent() {
		return isParent;
	}

	public void setIsParent(boolean isParent) {
		this.isParent = isParent;
	}

	public boolean isHasParent() {
		return hasParent;
	}

	public void setHasParent(boolean hasParent) {
		this.hasParent = hasParent;
	}

	public boolean isChecked() {
		return checked;
	}

	public void setChecked(boolean checked) {
		this.checked = checked;
	}

	/**
	 * 把树节点列表构造成树，最后返回树的根节点，如果传入的列表有多个根节点，会动态创建一个根节点。
	 * @param nodes 树节点列表
	 * @return 返回树的顶级节点列表，如果只有一个顶级节点，列表中只有一个元素
	 */
	public static <T> List<SimpleTreeNode<T>> buildTree(List<SimpleTreeNode<T>> nodes){
		if(nodes == null || nodes.size() == 0){
			return null;
		}
		
		if(nodes.size() == 1){
			return nodes;
		}
		
		//用来存放nodes里面的顶级树节点
		//也就是把没有父节点的节点都放到tops里面去
		List<SimpleTreeNode<T>> tops = new ArrayList<SimpleTreeNode<T>>();
		
		boolean hasParent = false;
		//第一次遍历，获取一个节点作为子节点
		for(SimpleTreeNode<T> child : nodes){
			hasParent = false;
			
			//当前节点child的父节点id
			String pid = child.getParentId();
			
			//如果pid不存在或为空
			//则当前节点为顶级节点
			if(pid == null || pid.equals("")){
				//把当前节点添加到tops中作为顶级节点
				tops.add(child);
				//跳过当前节点，进入下一轮
				continue;
			}
			
			//遍历nodes上的所有节点，判断是否有child的父节点
			for(SimpleTreeNode<T> parent : nodes){
				String id = parent.getId();
				
				//如果parent节点的id等于child节点的pid，则parent节点是child节点的父节点
				if(id != null && id.equals(pid)){
					
					//把child加到parent下
					parent.getChildren().add(child);
					parent.setIsParent(true);
					
					child.setHasParent(true);
					
					//child节点有父节点
					hasParent = true;
					
					continue;
				}
			}
			
			//如果child节点没有父节点，则child是顶级节点
			//把child添加到tops中
			if(!hasParent){
				tops.add(child);
			}
		}
		
		return tops;
	}
}
